本文主要对Array类型的使用场景、数据推送及搜索语法进行系统的介绍,方便大家理解。
什么场景下适合使用ARRAY类型?
Array类型即为数组类型,数组类型即由相同类型的若干个元素组织在一起的数据,期望在搜索的时候对于每一个元素都可以执行单独的查询。比如小说的标签tags,包含“悬疑”、“穿越”、“古典”,希望在搜索“悬疑”的时候能找到该篇小说。
如何推送ARRAY类型的数据?
目前OpenSearch支持多种方式的数据推送方式,那我们就从每个途径来分开阐述如何进行数据推送。
API方式
ARRAY类型需要采用JsonArray的方式来上传数据。如:
[
{
"fields": {
"id": "0",
"int_array": [
14,
85
],
"float_array": [
14.0,
85.0
],
"literal_array": [
"abc",
"xyz"
]
},
"cmd": "ADD"
}
]
具体数据上传接口:数据处理
SDK方式
可以参考JAVA SDK示例:Push推送Demo,其他SDK做法类似。
数据源方式
数据源配置允许用户对于数据源数据进行多种格式的解析操作,如果定义了ARRAY类型的字段,可以在该字段上选择MultiValueSpliter插件,定义好多值分隔符,比如上例中的tags,在数据库表中字段内容为:“穿越,悬疑,言情”,那么多值分隔符为英文逗号:“,”,如图所示即可。该插件会自动将数据库中字段转化成为引擎识别的ARRAY类型。MultiValueSpliter插件(参考数据源插件说明)
ARRAY类型如何进行检索?能实现怎样的效果?
ARRAY类型的每一个元素都可以单独访问,不管是用在query子句,还是filter子句,如上例中的tags字段(内容为:穿越,悬疑,言情),可以通过query=tags:'穿越'
,来找到该文档;也可以通过query=title:'步步惊心'&&filter=tags="穿越"
,来实现标签为“穿越”的名字包含“步步惊心”的小说。
同时需要注意一点的是,搜索结果对于Array类型是按照字符串返回的,元素之间使用’\t’分隔,而不是数组。
FAQ
Q1: 为什么没有text_array类型,text与string_array有什么区别?
A: text类型(包含text、short_text、nws_text、mws_text)涉及到分词,本身支持的是模糊搜索,所以没有数组的概念,而string_array指的是每个元素的精确匹配,很可能这里的单个元素本身是由多个词组组成的,但是没关系要求的是全部匹配。
Q2: 有没有方法获得array类型的元素个数?
A: 系统提供了fieldlen函数(参考filter子句),可以获取元素个数。
Q3:Java 代码中推送数据,数组类型应该如何传入?
A:通过数组类型的变量传入,例,literal_array--->String [] ,int_array--->int []。